#pragma once
#include <iostream>
#include <atomic>
#include <queue>
#include <string>
#include <memory>
#include <mutex>
#include <thread>
#include <functional>
#include <memory>
#include <condition_variable>
#include "Connection.h"

using namespace std;

class Connection_pool
{

public:
    //获取连接池对象实例
    static Connection_pool *getConnectionPool();

    //需要重定义删除器，将连接归还到连接池当中
    shared_ptr<Connection> getConnection();

private:
    Connection_pool();

public:
    //从配置文件中加载配置项
    bool loadConfigFile();
    //运行在独立的线程中，专门用来生产新连接
    void produceConnectionTask();

    void scannerConnectionTask();

    string _ip;           // mysql ip
    unsigned short _port; //端口
    string _username;     //用户名
    string _password;
    string _dbname; //连接数据库名称
    int _initSize;  //初始连接量
    int _maxSize;
    int _maxIdleTime;
    int _connectionTimeout; //连接池超时时间

    queue<Connection *> _connectionQue; //存储mysql连接的队列
    mutex _queueMutex;                  //维护连接队列的线程安全互斥锁

    std::atomic_int _connectionCnt; //记录连接的总数量`
    std::condition_variable cv;     //设置条件变量，用于连接上产和消费的通信
};